/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Utilidades;

import java.io.*;

/**
 * Lee el archivo XML
 * @author Administrador
 */
public class LectorXML {

    private File f; //Archivo a leer
    private BufferedReader lector; //
    private boolean eof; //Bandera para determinar si se llegó al final del archivo

    /**
     * Constructor que recibe por parámetro el path del archivo a parsear
     * @param path Dirección de la ubicación del archivo a parsear
     * @throws FileNotFoundException
     */
    public LectorXML(String path) throws FileNotFoundException{
        this(new File(path));
    }

    /**
     * Constructor que recibe por parámetro el archivo a parsear e inicializa las variables de clase
     * @param xmlFile Archivo a parsear
     * @throws FileNotFoundException
     */
    public LectorXML(File xmlFile) throws FileNotFoundException {
        f = xmlFile;
        lector = new BufferedReader(new FileReader(f));
        eof = false;
    }

    /**
     * Devuelve si se llego al final del archivo
     * @return true si es el final, false en caso contrario
     */
    public boolean eof() {
        return this.eof;
    }

    /**
     * Cierra el archivo XML
     * @return 
     */
    public boolean close() {
        boolean resultado = true;

        try {
            lector.close();
        } catch (IOException ex) {
            resultado = false;
        } finally {
            return resultado;
        }
    }

    public char getChar() throws IOException{
        return (char) lector.read();
    }

    /**
     * Lee el archivo XML y devuelve el resultado de esa lectura que puede ser:
     * -Etiqueta
     * -Prólogo
     * -Inicio de DTD
     * -Contenido
     * -CData
     * @return Un String que representa algunas de las cosas nombradas arriba.
     */
    public String getNext() {
        String resultado = "";
        int i = 0;
        char ch0 = (char) -1;
        char ch1 = (char) -1;

        try {

            do {
                i = lector.read();
                ch0 = (char) i;
            } while (i != -1 && (String.valueOf("\n").charAt(0) == ch0
                              || String.valueOf("\t").charAt(0) == ch0
                              || String.valueOf(" ").charAt(0)  == ch0
                              || String.valueOf("\r").charAt(0) == ch0));

            resultado = resultado + String.valueOf(ch0);
            boolean esFinal = false;

            do {
                switch (ch0) {
                    case '<':
                        i = lector.read();
                        ch1 = (char) i;
                        resultado = resultado + String.valueOf(ch1);
                        esFinal = (ch1 == '>' || resultado.equals("<!DOCTYPE "));
                        lector.mark(1);
                        break;
                    default:
                        lector.mark(1);
                        i = lector.read();
                        ch1 = (char) i;
                        if (ch1 != '<') {
                            resultado = resultado + String.valueOf(ch1);
                        } else {
                            esFinal = true;
                        }
                        break;
                }
            } while (!esFinal && i != -1 && eof == false);

            lector.reset();

        }
        catch (IOException ioe) {
            System.out.println("Error en getNext() al resetear el lector");
        }
        catch (Exception ex) {
        } finally {
            if (i == -1) {
                this.eof = true;
                resultado = null;
            }
            if (resultado != null) {
                resultado = resultado.trim();
            }
            return resultado;
        }
    }
}
